package br.edu.fateczl.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import br.edu.fateczl.model.Cliente;
import br.edu.fateczl.model.Contato;
import br.edu.fateczl.model.Endereco;
import br.edu.fateczl.model.Pessoa;

public class ClienteDAO {

	Connection c;

	public ClienteDAO() {
		GenericDAO gDao = new GenericDAO();
		c = gDao.getConnection();
	}

	public boolean insereCliente(Cliente cliente) {
		boolean inserido = false;
		String sql = "INSERT INTO cliente (registro,codigo_pessoa,num_dias,limite_obras) VALUES (?,?,?,?)";

		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, cliente.getRegistro());
			ps.setInt(2, cliente.getCodigo_pessoa());
			ps.setInt(3, cliente.getNumDias());
			ps.setInt(4, cliente.getLimite());
			ps.execute();
			ps.close();
			inserido = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return inserido;
	}

	public boolean atualizaCliente(Cliente cliente) {
		boolean atualizado = false;
		String sql = "UPDATE cliente Set registro= ?,num_dias= ?,limite_obras= ? WHERE codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, cliente.getRegistro());
			ps.setInt(2, cliente.getNumDias());
			ps.setInt(3, cliente.getLimite());
			ps.setInt(4, cliente.getCodigo());
			ps.execute();
			ps.close();
			atualizado = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Cliente: " + e.getMessage(),
					"Erro", JOptionPane.ERROR_MESSAGE);
		}
		return atualizado;

	}

	public boolean excluiCliente(Cliente cliente) {
		boolean excluido = false;
		String sql = "DELETE cliente WHERE codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, cliente.getCodigo());
			ps.execute();
			ps.close();
			excluido = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return excluido;
	}

	public Cliente consultaCliente(Cliente cliente) {
		Cliente clienteConsultado = new Cliente();
		String sql = "SELECT codigo,registro,codigo_pessoa,num_dias,limite_obras FROM cliente Where codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, cliente.getCodigo());
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				clienteConsultado.setCodigo(rs.getInt("codigo"));
				clienteConsultado.setRegistro(rs.getInt("registro"));
				clienteConsultado.setCodigo_pessoa(rs.getInt("codigo_pessoa"));
				clienteConsultado.setNumDias(rs.getInt("num_dias"));
				clienteConsultado.setLimite(rs.getInt("limite_obras"));
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return clienteConsultado;
	}

	public List<Cliente> consultaListaCliente() {
		List<Cliente> listaCliente = new ArrayList<Cliente>();
		String sql;
		sql = "SELECT c.codigo as codigo,p.nome as nome,e.cep,e.logradouro, co.telefone,co.celular FROM pessoa p INNER JOIN endereco e ON p.codigo_endereco = e.Codigo INNER JOIN contato co ON p.codigo_contato = co.codigo INNER JOIN cliente c ON p.codigo = c.codigo_pessoa";
		try {
			PreparedStatement ps = c.prepareStatement(sql.toString());
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				Cliente clienteConsultado = new Cliente();
				Endereco endereco = new Endereco();
				Contato contato = new Contato();

				clienteConsultado.setCodigo(rs.getInt("codigo"));
				clienteConsultado.setNome(rs.getString("nome"));
				clienteConsultado.getEndereco().setCep(rs.getString("cep"));
				clienteConsultado.getEndereco().setLogradouro(
						rs.getString("logradouro"));
				clienteConsultado.getContato().setTelefone(
						rs.getString("telefone"));
				clienteConsultado.getContato().setCelular(
						rs.getString("celular"));

				listaCliente.add(clienteConsultado);
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			System.out.println("erro");
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return listaCliente;

	}
	
	
	
	public List<Cliente> listaCombo() {
		List<Cliente> listaCliente = new ArrayList<Cliente>();
		StringBuffer sql = new StringBuffer();
		sql.append("select cliente.codigo,pessoa.nome,num_dias,limite_obras from cliente");
		sql.append(" INNER JOIN pessoa");
		sql.append(" on pessoa.codigo = cliente.codigo_pessoa");
		try {
			PreparedStatement ps = c.prepareStatement(sql.toString());
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				Cliente clienteConsultado = new Cliente();
				Endereco endereco = new Endereco();
				Contato contato = new Contato();
				clienteConsultado.setCodigo(rs.getInt("codigo"));
				clienteConsultado.setNome(rs.getString("nome"));
				clienteConsultado.setNumDias(rs.getInt("num_dias"));
				clienteConsultado.setLimite(rs.getInt("limite_obras"));
				listaCliente.add(clienteConsultado);
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			System.out.println("erro");
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return listaCliente;

	}

	public Cliente dadosCliente(int codigoCliente) {
		Cliente cliente = new Cliente();
		StringBuffer sql = new StringBuffer();
		sql.append("select pessoa.codigo as pessoa_codigo , pessoa.codigo_contato as codigo_contato,");
		sql.append("pessoa.codigo_endereco as codigo_endereco,pessoa.data_nascimento as data_nascimento,");
		sql.append("pessoa.nome as nome , pessoa.rg as registro_geral,cliente.limite_obras as limite_obras,");
		sql.append("cliente.num_dias as numero_dias,cliente.registro as registro ");
		sql.append("FROM cliente inner join pessoa ");
		sql.append("on pessoa.codigo = cliente.codigo_pessoa ");
		sql.append("where cliente.codigo = ?");
		try {
			Connection con = GenericDAO.getConnection();
			PreparedStatement ps = con.prepareStatement(sql.toString());
			ps.setInt(1, codigoCliente);
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {

				cliente.setCodigo_pessoa(rs.getInt("pessoa_codigo"));
				cliente.setCodigo_contato(rs.getInt("codigo_contato"));
				cliente.setCodigo_endereco(rs.getInt("codigo_endereco"));
				cliente.setDataNasc(rs.getDate("data_nascimento"));
				cliente.setNome(rs.getString("nome"));
				cliente.setRg(rs.getString("registro_geral"));
				cliente.setLimite(rs.getInt("limite_obras"));
				cliente.setNumDias(rs.getInt("numero_dias"));
				cliente.setRegistro(rs.getInt("registro"));

			}
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return cliente;
	}
}
